﻿<!DOCTYPE html>

<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8" />
    <title></title>
</head>
<body>
    <script>
        console.log(num);//nudefined
        var num = 10;
        //run();//报错 run不是一个函数
        console.log(run);//undefined
        var run = function () {
            console.log(`run`);
        }
        run1();
        function run1() {
            console.log(`---`);
        }
        // var 可以重复声明(不推荐)
        // 有声明提升
        // 以函数区分作用域
        var num = 20;
        console.log(num);
        function run2() {
            console.log(num);//undefined
            var num = 30;
            console.log(num);//30
            var n = 100; //局部变量
        }
        run2();
        //console.log(n);//报错 外部作用域不可以使用内部作用域的变量

        // let没有声明提升
        // let的作用域是以{}区分的 块级作用域
        // let不可以重复声明
        // console.log(str); 报错
        let str = `111`;
        if (true) {
            let str1 = `222`;
            console.log(str1);
        }
        // console.log(str1); //报错

        // let str = "333"; //报错
        if (true) {
            var num3 = 40;

        }
        console.log(num3);//40
        // 同步: 代码从上往下一步一步执行,上面代码没有执行完,下边代码不会执行
        // 异步: 代码从上往下,可以让一下需要等待时间的代码同时执行,不影响下边代码的执行

         // index是全局变量
        // 循环先执行; 操作的是唯一的一个index值的更改
        // 在循环执行完后,再次使用index 得到的是更改后的index的值

        for (var index = 0; index < 10; index++) {
            // console.log(index);
            // 异步执行
            setTimeout(function () {
                // 76行执行之后才会执行的 
                console.log(index);//  10
            }, 4)


        }
        console.log("---");
        console.log(index); //10

        // b是 块级变量
        // 会先执行循环, 但是每个循环都是一个单独的作用域(对于let来说)
        // 那么在每个循环体中都会有一个块级变量b的值等于当前b的值
        // 每个作用域都是独立的
        // 在循环内后来使用b时,得到的都是当前作用域记录的b的值
        for (let b = 2; b < 10; b++) {

            // 异步执行
            setTimeout(function () {
                console.log(b); // 0--9
            }, 4)


        }
        console.log("====", b); //报错
    </script>

</body>
</html>